/*
 [auto_generated]
 boost/numeric/odeint/stepper/detail/rotating_buffer.hpp

 [begin_description]
 Implemetation of a rotating (cyclic) buffer for use in the Adam Bashforth stepper
 [end_description]

 Copyright 2009-2011 Karsten Ahnert
 Copyright 2009-2011 Mario Mulansky

 Distributed under the Boost Software License, Version 1.0.
 (See accompanying file LICENSE_1_0.txt or
 copy at http://www.boost.org/LICENSE_1_0.txt)
 */

#ifndef BOOST_NUMERIC_ODEINT_STEPPER_DETAIL_ROTATING_BUFFER_HPP_INCLUDED
#define BOOST_NUMERIC_ODEINT_STEPPER_DETAIL_ROTATING_BUFFER_HPP_INCLUDED

#include <boost/array.hpp>

namespace boost {
namespace numeric {
namespace odeint {
namespace detail {

template <class T, size_t N>
class rotating_buffer {
public:
  typedef T value_type;
  const static size_t dim = N;

  rotating_buffer(void) : m_first(0) {
  }

  size_t size(void) const {
    return dim;
  }

  value_type& operator[](size_t i) {
    return m_data[get_index(i)];
  }

  const value_type& operator[](size_t i) const {
    return m_data[get_index(i)];
  }

  void rotate(void) {
    if (m_first == 0)
      m_first = dim - 1;
    else
      --m_first;
  }

protected:
  value_type m_data[N];

private:
  size_t get_index(size_t i) const {
    return ((i + m_first) % dim);
  }

  size_t m_first;
};

}  // detail
}  // odeint
}  // numeric
}  // boost

#endif  // BOOST_NUMERIC_ODEINT_STEPPER_DETAIL_ROTATING_BUFFER_HPP_INCLUDED
